package base

import (
	"errors"
	"fmt"
	"go_iot/pkg/global"

	"gorm.io/gorm"
)

type Base struct {
	ID int `json:"id" gorm:"primaryKey"`
}

type Tabler interface {
	TableName() string
}

func GetItem[T Tabler](id int) T {
	var t T
	global.Db.First(&t, id)
	return t
}

func DeleteItem[T Tabler](id int) error {
	var t T
	err := global.Db.Delete(&t, id).Error
	return WrapError(err)
}

func GetListPage[T Tabler](m map[string]any, page, pageSize int) ([]T, int) {
	if page < 1 {
		page = 1
	}
	if pageSize < 5 {
		pageSize = 5
	}
	var tps []T
	var tp []T
	sql := global.Db
	for k, v := range m {
		sql = sql.Where(k, v)
	}
	total := sql.Find(&tps).RowsAffected

	sql.Limit(pageSize).Offset((page - 1) * pageSize).Find(&tp)
	return tp, int(total)
}

func CreateItem[T Tabler](t *T) error {
	err := global.Db.Create(t).Error
	return WrapError(err)
}

func WrapError(err error) error {
	if err != nil {
		switch {
		case errors.Is(err, gorm.ErrRecordNotFound):
			return fmt.Errorf("记录未找到: %w", err)
		case errors.Is(err, gorm.ErrDuplicatedKey):
			return fmt.Errorf("重复key: %w", err)
		case errors.Is(err, gorm.ErrInvalidData):
			return fmt.Errorf("不可用数据: %w", err)
		default:
			return fmt.Errorf("数据库错误: %w", err)
		}
	}
	return nil
}
